package com.File;

import org.junit.Test;

import java.io.File;
import java.io.IOException;

/**
 * File类的使用
 * 1.File类的对象，代表一个文件或者一个文件目录(俗称文件夹)
 * 2.File类是声明在java.io包下的。
 */
public class FileTest {

    /**
     * 1.如何获取File类的实例
     * <p>
     * 2.
     * 相对路径:相较于某个路径下，指明的路径。
     * 绝对路径:包含盘符在内的文件或者文件目录的路径。
     * <p>
     * 3.路劲分割符
     * 在不同的操作系统中，路径分割符和系统有关:
     * windows和DOS系统默认使用"\"来表示
     * UNIX和URL使用"/"来表示
     * 因为java程序支持跨平台运行，因此路径分割符要慎用。
     * 为了解决这个隐患，File类提供了一个常量:
     * public static Final String separator,根据操作系统，动态的提供分割符。
     */

    @Test
    public void test1() {

        //相对于当前的module
        File file = new File("hello.txt");

        //绝对路径
        File file1 = new File("D:\\..");

        //动态分割符
        File file2 = new File("D:\\atguigu\\demo");
        File file3 = new File("d:" + File.separator + "atguigu");


        //举例子,构造器2:
        File file4 = new File("D:\\atguigu", "java");

        System.out.println(file4);

        //构造器3：
        File file5 = new File(file4, "hi.txt");

    }

    /**
     * File的获取功能
     */
    @Test
    public void test2() {
        File file = new File("hello.txt");
        File file1 = new File("d:" + File.separator + "io");

        //获取绝对路径
        System.out.println(file1.getAbsolutePath());

        //获取路径
        System.out.println(file1.getPath());

        //获取名称
        System.out.println(file1.getName());

        //获取上层文件目录路径，若无，返回null
        System.out.println(file1.getParent());

        //获取文件长度(即:字节数)，不能获取目录的长度
        System.out.println(file1.length());

        //获取文件最后一次的修改时间
        System.out.println(file1.lastModified());

        //如下的两个方法，只适用于文件目录
        //获取指定目录下的所有文件或者文件目录的名称数组
        String[] list = file1.list();
        for (String string : list) {
            System.out.println(list);
        }

        //获取指定目录下的所有文件或者文件目录的File数组
        File[] files = file1.listFiles();
        for (File file2 : files) {
            System.out.println(file2);
        }
    }


    //public boolean renameTo(File dest):把文件重命名为指定的文件路径
    //要想保住修改成功，需要file1在硬盘中是存在的，切file2不能存在
    @Test
    public void test3() {
        File file1 = new File("d:" + File.separator + "i.txt");
        boolean b = file1.renameTo(new File("D:\\hi.txt"));
        System.out.println(b);
    }


    //判断功能
    @Test
    public void test4(){
        File file1 = new File("d:" + File.separator + "hi.txt");

        //判断是否是文件目录
        boolean directory = file1.isDirectory();
        System.out.println(directory);

        //判断是否是文件
        boolean file = file1.isFile();
        System.out.println(file);

        //判断是否存在
        boolean exists = file1.exists();
        System.out.println(exists);
        //判断是否可读
        boolean b = file1.canRead();
        System.out.println(b);

        //判断是否可写
        boolean b1 = file1.canWrite();
        System.out.println(b1);

        //判读是否隐藏
        boolean hidden = file1.isHidden();
        System.out.println(hidden);
    }


    //创建功能
    @Test
    public void test5(){
        //创建文件
        File file = new File("d:"+File.separator+"demo.exe");
        try {
            boolean newFile = file.createNewFile();
            System.out.println(newFile);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //创建文件目录和删除功能
        boolean mkdir = new File("d:\\test").mkdir();
        System.out.println(mkdir);

        //创建文件目录，如果上级目录不存在，一并创建
        boolean mkdirs = new File("d:\\test1\\mkadi\\dw").mkdirs();
        System.out.println(mkdirs);

        //删除文件或者文件夹
        //删除注意事项:java中的删除是不走回收站的，要删除一个文件目录，请注意该文件目录内不能包含文件或者文件目录。
        boolean delete = new File("d:\\test1\\mkadi\\dw").delete();
        System.out.println(delete);



    }
}
